import axios from 'axios'
import ElementUI from 'element-ui'
import router from '@/router/index.js'

const baseURL = 'http://127.0.0.1:8886'; //'http://47.115.202.12:8081';

//创建axios实例，封装成request简写代码
const request = axios.create({
    // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
    // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
    baseURL: baseURL,  // 注意！！ 这里是全局统一加上了 '/api' 前缀，也就是说所有接口都会加上'/api'前缀在，页面里面写接口的时候就不要加 '/api'了，否则会出现2个'/api'，类似 '/api/api/user'这样的报错，切记！！！
    // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
    // 如果请求花费了超过 `timeout` 的时间，请求将被中断
    timeout: 60000,
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded';//'application/json;charset=utf-8'
    if (localStorage.getItem("loginUser") != undefined) {
        // 设置请求头
        config.headers['Authorization'] = JSON.parse(localStorage.getItem("loginUser")).token;
    }
    return config;
}, error => {
    return Promise.error(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        if (response.status == 200) {
            let res = response.data;
            // 如果是返回的文件
            //Blob(Binary long Object)是二进制长对象的意思,Blob通常用于存储大文件,典型的Blob内容是一张图片或者一个声音文件
            if (response.config.responseType === 'blob') {
                return response;
            }
            // 兼容服务端返回的字符串数据
            if (typeof res === 'string') {
                res = res ? JSON.parse(res) : res
            }
            // 判断系统响应码
            if (res.code == 401) {
                ElementUI.Message({
                    message: '登录已过期，请重新登录，否则无法正常使用',
                    type: 'warning'
                });
                //跳转到登录页
                router.replace("/login");
            } else {
                return Promise.resolve(res);
            }
        } else {
            //http响应码不为200时
            ElementUI.Message({
                message: '服务响应异常，请稍后重试',
                type: 'error'
            });
            return Promise.reject(response);
        }
    },
    error => {
        //有时候的服务响应异常会触发
        ElementUI.Message({
            message: '服务响应异常，请稍后重试',
            type: 'error'
        });
        return Promise.reject(error)
    }
)

// 自定义同步的GET方法
const asyncGet = async (url, params) => {
    try {
        const response = await request.get(url, params);
        return response;
    } catch (error) {
        return Promise.reject(error);
    }
};

// 自定义同步的POST方法
const asyncPost = async (url, data) => {
    try {
        const response = await request.post(url, data);
        return response;
    } catch (error) {
        return Promise.reject(error);
    }
};

export {
    request,
    baseURL
}
